package top.shiyiri.stream;

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author Aunean
 * @date 2022/1/9
 */
/*
测试 FileInputStream 和 FileOutputStream的使用

结论：
1.对于文本文件（.java、.txt），使用字符流处理
2.对于非文本文件（图片、视频、.doc、.ppt），私用字节流处理
 */
public class FileInputOutputStream {

    /*
    实现对图片的复制
     */
    @Test
    public void testFileInputOutputStream() {
        //1.创建File类的对象，指明读入和写出的文件
        File inputFile = new File("../data/photo/u029.png");
        File outputFile = new File("../data/photo/u2.png");

        //2.创建FileReader类和FileWriter类的对象
        FileInputStream fis = null;
        FileOutputStream fos = null;

        try {
            fis = new FileInputStream(inputFile);
            fos = new FileOutputStream(outputFile);

            //3.数据的读入和写出操作
            byte[] cbuf = new byte[5];
            int len;//记录每次读入cbuf数组中的字节的个数
            while ((len = fis.read(cbuf)) != -1) {
                //每次写入len个字符
                fos.write(cbuf, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.关闭流
            try {
                assert fos != null;
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //指定路径下文件的复制
    public void copyFile(String srcPath, String destPath) {
        //1.创建File类的对象，指明读入和写出的文件
        File inputFile = new File(srcPath);
        File outputFile = new File(destPath);

        //2.创建FileReader类和FileWriter类的对象
        FileInputStream fis = null;
        FileOutputStream fos = null;

        try {
            fis = new FileInputStream(inputFile);
            fos = new FileOutputStream(outputFile);

            //3.数据的读入和写出操作
            byte[] cbuf = new byte[1024];
            int len;//记录每次读入cbuf数组中的字节的个数
            while ((len = fis.read(cbuf)) != -1) {
                //每次写入len个字符
                fos.write(cbuf, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.关闭流
            try {
                assert fos != null;
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Test
    public void testCopyFile() {
        long startTime = System.currentTimeMillis();

        String srcPath = "C:\\Users\\14533\\Pictures\\QQplayerPic\\毕设录屏.mp4";
        String destPath = "C:\\Users\\14533\\Pictures\\QQplayerPic\\复制.mp4";

        copyFile(srcPath, destPath);

        long endTime = System.currentTimeMillis();
        System.out.println("复制操作所花费的时间为：" + (endTime - startTime));//503
    }
}
